package com.kongfanyu.springcloud.config;
//主板接口
interface MainBoardApi{
	public void open();//开机功能
	public void reset();//重启功能
}
//技嘉主板
class GigaMainBoard implements MainBoardApi{
	//真正的开机命令的实现
	public void open() {
		System.out.println("技嘉主板现在正在开机，请稍候...");
		System.out.println("接通电源...");
		System.out.println("设备检查...");
		System.out.println("装载系统...");
		System.out.println("机器已经正常打开,请操作...");
	}

    //真正重启命令的实现
    @Override
    public void reset() {
        System.out.println("技嘉主板现在正在重新启动机器，请等候..");
        System.out.println("机器已经正常打开，请操作");
    }
}
//微星主板
class MsiMainBoard implements MainBoardApi{
	//真正的开机命令的实现
	public void open() {
		System.out.println("微星主板现在正在开机，请稍候...");
		System.out.println("接通电源...");
		System.out.println("设备检查...");
		System.out.println("装载系统...");
		System.out.println("机器已经正常打开,请操作...");
	}
    //真正重启命令的实现
    @Override
    public void reset() {
        System.out.println("微星主板现在正在重新启动机器，请等候..");
        System.out.println("机器已经正常打开，请操作");
    }
}
//命令接口
interface Command{
	public void execute(); //执行命令
}
//开机命令
class OpenCommand implements Command{
	private MainBoardApi mainBoard;//持有真正的实现命令的接受者——主板对象
	//构造方法传入主板对象
	public  OpenCommand(MainBoardApi mainBoardApi) {
		this.mainBoard = mainBoardApi;
	}
	@Override
	public void execute() {
		//对于命令对象，根本不知道如何开机，会转调用主板对象
		//让主板对象去完成开机的功能
		this.mainBoard.open();
	}
}
//重启命令
class ResetCommand implements Command{
    private MainBoardApi mainBoard;//持有真正的实现命令的接受者——主板对象
    //构造方法传入主板对象
    public  ResetCommand(MainBoardApi mainBoardApi) {
        this.mainBoard = mainBoardApi;
    }
    @Override
    public void execute() {
        //对于命令对象，根本不知道如何重启机器，会转调用主板对象
        //让主板去完成重启机器的功能
        this.mainBoard.reset();
    }
}
//机箱对象
class Box{
	private Command openCommand;//开机命令对象
    private Command resetCommand;//重启机器命令对象
	//设置开机命令对象
	public void setCommand(Command command) {
		this.openCommand = command;
	}
	//设置重启命令对象
    public void setResetCommand(Command command){
	    this.resetCommand = command;
    }
	//提供给客户使用，接收并响应用户请求，相当于按钮被按下触发的方法
	public void openButtonPressed() {
		openCommand.execute();
	}
	//提供给用户使用，接收并响应用户请求，相当于重启按钮被按下触发的方法
    public void resetButtonPressed(){
        //按下按钮，执行命令
        this.resetCommand.execute();;
    }
}
public class CommandPatternTest2 {

	public static void main(String[] args) {
		//1.把命令和真正的实现组合起来，相当于在组装机器
		//把机箱上按钮的连接线插接到主板上
		MainBoardApi mainBoard = new GigaMainBoard();
		//创建开机命令
		Command openCommand = new OpenCommand(mainBoard);
		Command resetCommand = new ResetCommand(mainBoard);
		//2.为机箱上的按钮设置相应的命令，让按钮知道该干什么
		Box box = new Box();
		box.setCommand(openCommand);
		box.setResetCommand(resetCommand);
		//3.模拟按下机箱上的按钮
        System.out.println("正确配置下=======================>");
        System.out.println(">>>按下开机按钮:>>>");
        box.openButtonPressed();
        System.out.println(">>>按下重启按钮:>>>");
        box.resetButtonPressed();
	}
}
